package com.kingmed.kmss.common.redis.dao.impl;

import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Component;

import com.kingmed.kmss.common.redis.dao.IRedisIdGeneratorDao;

import java.util.concurrent.TimeUnit;

@Component
public class RedisIdGeneratorDaoImpl implements IRedisIdGeneratorDao {
	@Autowired
	private RedisTemplate<String, Object> redisTemplate;

	@Autowired
	private RedissonClient redissonClient;

	/**
	 * 生成序号 : 基于 Spring + JedisClient
	 * 
	 * @param key 生成序号的键值
	 * @param timeout 失效的时间量
	 * @param unit 失效的时间单位
	 * @return
	 */
	public long generateId(String key, long timeout, TimeUnit unit) {
		RedisAtomicLong counter = new RedisAtomicLong(key, this.redisTemplate.getConnectionFactory());
		counter.expire(timeout, unit);
		return counter.incrementAndGet();
	}

	/**
	 * 生成序号: 基于 RedissonClient。 在分布式环境下，计数器效果更好
	 * 
	 * @param key 生成序号的键值
	 * @param timeout 失效的时间量
	 * @param unit 失效的时间单位
	 * @return
	 */
	public long generateIdWithinDistributedEnv(String key, long timeout, TimeUnit unit) {
		RAtomicLong atomicLong = redissonClient.getAtomicLong(key);
		atomicLong.expire(timeout, unit);
		return atomicLong.incrementAndGet();
	}
}
